package org.huawei260.TiKu.B;

/**
 * @Auther: qingle
 * @Date: 2024/10/27-21:24
 * @Description:
 *
 * 存在一种虚拟IPv4地址，由4小节组成，除了第一小节的范围是1-128以外，其余三节的范围为0-255，以#号间隔，
 *
 *                 格式如下： (1~128)#(0~255)#(0~255)#(0~255)
 *
 *                 例如：
 *
 *                 128#0#255#255，转换为32位整数的结果为2147549183（0x8000ffff）
 *
 *                 1#0#0#0，转换为32位整数的结果为16777216（0x01000000）
 *
 *                 请利用这个特性把虚拟IPv4地址转换为一个32位的整数，IPv4地址以字符串形式给出，
 *
 *                 要求每个IPvV4地址只能对应到唯一的整数上。 如果是非法IPv4，输出字符串"invalid IP"。
 *
 *   要求每个IPvV4地址只能对应到唯一的整数上。 如果是非法IPv4，输出字符串"invalid IP"。
 *
 * 输入格式
 *                 输入一行，虚拟IPv4地址格式字符串
 * 输出格式
 *
 * 		输出一行，按照要求输出整型或者特定字符
 *
 * 输入样例    复制
 * 100#101#1#5
 * 输出样例    复制
 * 1684340997
 *
 * @version: 1.0
 */
public class B_2508_IPv4地址转换成整数2 {
//	public class VirtualIPv4ToInt {
		public static void main(String[] args) {
			// 测试示例
			System.out.println(virtualIPv4ToInt("128#0#255#255"));  // 应输出 2147549183
			System.out.println(virtualIPv4ToInt("1#0#0#0"));        // 应输出 16777216
			System.out.println(virtualIPv4ToInt("129#0#0#0"));      // 应输出 "invalid IP"
			System.out.println(virtualIPv4ToInt("1#256#0#0"));      // 应输出 "invalid IP"
			System.out.println(virtualIPv4ToInt("1#0#0#256"));     // 应输出 "invalid IP"
			System.out.println(virtualIPv4ToInt("1#0#0"));         // 应输出 "invalid IP"
		}
//
//	public static void main(String[] args) {
//		Scanner sc = new Scanner(System.in);
//		System.out.println(virtualIPv4ToInt(sc.nextLine()));
//	}

	public static String virtualIPv4ToInt(String s) {
		String[] ip = s.split("#");

		// ip地址由四部分组成，少于或多于四部分都不合法
		if (ip.length != 4) return "invalid IP";

		// 如果ip地址四部分某部分不合法，则ip不合法
		if (!isValid(ip[0], 1, 128)
			|| !isValid(ip[1], 0, 255)
			|| !isValid(ip[2], 0, 255)
			|| !isValid(ip[3], 0, 255)) {
			return "invalid IP";
		}

		// 这里需要转为long，某些情况使用int会整型溢出
		return Long.parseLong(
			getHexString(ip[0]) + getHexString(ip[1]) + getHexString(ip[2]) + getHexString(ip[3]),
			16)
			+ "";
	}

	// ip组成是否合法
	public static boolean isValid(String s, int from, int to) {
		// 如果包含非数字字符，则不合法
		if (!s.matches("^\\d+$")) return false;

		// 如果包含前导0，则不和法，如012
		int num = Integer.parseInt(s);
		if (!s.equals(num + "")) return false;

		// 如果不是规定范围，则不合法
		return num >= from && num <= to;
	}

	// 获取十进制数字符串对应的十六进制数字符串
	public static String getHexString(String num) {
		String hexStr = Integer.toHexString(Integer.parseInt(num));
		// 补足前导0
		if (hexStr.length() < 2) hexStr = "0" + hexStr;
		return hexStr;
	}
}